package itheima05;

import domain.Users;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;
import utils.C3P0Util;

import java.sql.SQLException;
import java.util.List;

/*


    核心类QueryRunner
    空参构造:
        public QueryRunner(): 可以直接创建对象,但是没有传递Connection连接对象
            所以该对象调用方法,执行增删改查时,必须传Connection连接对象
    执行查询:
        public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) :
            执行查询,根据参数ResultSetHandler获取对应的结果
            参数:
                1.Connection conn: 连接对象
                2.String sql: sql语句,参数用?代替
                3.ResultSetHandler<T> rsh: 结果集处理器,接口,必然传递实现类对象
                    实现类: 根据不同的方式处理ResultSet,返回不同结果

                4.Object... params: 可变参数,传递参数列表,数组,不传参  作用: 给sql中?进行赋值的
        BeanHandler: 返回指定类型的对象
 */
/*public class Demo08DBUtils {
    //根据uid,获取一个Users对象
    @Test
    public void queryUserByUid() throws SQLException {
        *//*
            结果集处理器: BeanHandler
            作用: 把查询结果的第一行,封装成指定类型的对象
            构造方法:
                public BeanHandler(Class clazz): 传递Class类型的对象
         *//*
        QueryRunner qr = new QueryRunner();
        String sql = "select * from users where uid=?";
        *//*
             new BeanHandler<Users>(Users.class): 告诉它,把结果封装成什么类型的对象
         *//*
        Users user = qr.query(C3P0Util.getConnection(), sql, new BeanHandler<Users>(Users.class), "u001");
        System.out.println(user);
    }
    @Test
    public void queryUserByUid2() throws SQLException {
        *//*
            结果集处理器: BeanHandler
            作用: 把查询结果的第一行,封装成指定类型的对象
            构造方法:
                public BeanHandler(Class clazz): 传递Class类型的对象
         *//*
        QueryRunner qr = new QueryRunner();
        String sql = "select * from users";
        *//*
             new BeanHandler<Users>(Users.class): 告诉它,把结果封装成什么类型的对象
         *//*
        Users user = qr.query(C3P0Util.getConnection(), sql, new BeanHandler<Users>(Users.class));
       //只返回第一行结果
        System.out.println(user);
    }
    //要求查询,所有记录,每条记录封装成一个Users对象,存储到List集合中
    @Test
    public void queryAllUsers() throws SQLException {
        *//*
            结果集处理器: BeanListHandler
            作用: 把查询结果的每一行,封装成指定类型的对象,存储到List集合中
            构造方法:
                public BeanListHandler(Class clazz): 传递Class类型的对象,告诉结果集处理器,List集合中存储的数据的类型
         *//*
        QueryRunner qr = new QueryRunner();

        String sql = "select * from users";
        *//*
            new BeanListHandler<>(Users.class):
                告诉QueryRunner把查询结果存储到List集合中,List集合中存储的数据类型Users
         *//*
        List<Users> list = qr.query(C3P0Util.getConnection(), sql, new BeanListHandler<>(Users.class));
        //遍历
        for (Users u : list) {
            System.out.println(u);
        }
    }
}*/


public class Demo08DBUtils {
    @Test
    public  void queryUserByUid() throws SQLException {
       /*
            结果集处理器: BeanHandler
            作用: 把查询结果的第一行,封装成指定类型的对象
            构造方法:
                public BeanHandler(Class clazz): 传递Class类型的对象
         */
       QueryRunner queryRunner=new QueryRunner();
       String sql="select * from users where uid=?";

       Users users=queryRunner.query(C3P0Util.getConnection(),sql, new BeanHandler<Users>(Users.class),"u006" );

       System.out.println(users);
    }
    @Test
    public void  queryUserAll() throws SQLException {
        QueryRunner queryRunner=new QueryRunner();
        String sql="select * from users";

        Users users=queryRunner.query(C3P0Util.getConnection(),sql,new BeanHandler<Users>(Users.class));
        System.out.println(users);
    }

    @Test
    public void  queryUserList() throws SQLException {
        QueryRunner queryRunner=new QueryRunner();
        String sql="select * from users";
        List<Users> users=  queryRunner.query(C3P0Util.getConnection(),sql,new BeanListHandler<>(Users.class));
        for (Users user : users) {
            System.out.println(user);
        }
    }
}